package com.zjsru.plan2025.oneday;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 2274. 不含特殊楼层的最大连续楼层数
 *
 * @Author: cookLee
 * @Date: 2025-01-06
 */
public class MaxConsecutive {

    /**
     * 主
     * \
     * 输入：bottom = 2, top = 9, special = [4,6]
     * 输出：3
     * 解释：下面列出的是不含特殊楼层的连续楼层范围：
     * - (2, 3) ，楼层数为 2 。
     * - (5, 5) ，楼层数为 1 。
     * - (7, 9) ，楼层数为 3 。
     * 因此，返回最大连续楼层数 3 。
     * \
     * 输入：bottom = 6, top = 8, special = [7,6,8]
     * 输出：0
     * 解释：每层楼都被规划为特殊楼层，所以返回 0 。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MaxConsecutive maxConsecutive = new MaxConsecutive();
        int bottom = 2;
        int top = 9;
        int[] special = {4, 6};
        System.out.println(maxConsecutive.maxConsecutive2(bottom, top, special));
    }

    public int maxConsecutive(int bottom, int top, int[] special) {
        //可以直接加入bottom和top，遍历special两两相临的元素比较得出最大值
        List<Integer> newList = Arrays.stream(special)
                .boxed().collect(Collectors.toList());
        //保证最底层和最高层计算在内
        newList.add(bottom - 1);
        newList.add(top + 1);
        Collections.sort(newList);
        int ans = 0;
        for (int i = 1; i < newList.size(); i++) {
            ans = Math.max(ans, newList.get(i) - newList.get(i - 1) - 1);
        }
        return ans;
    }

    public int maxConsecutive2(int bottom, int top, int[] special) {
        Arrays.sort(special);
        int ans = 0;
        //计算最底层到第一个特殊楼层的距离
        ans = Math.max(ans, special[0] - bottom);
        for (int i = 1; i < special.length; i++) {
            ans = Math.max(ans, special[i] - special[i - 1] - 1);
        }
        //计算顶楼到最大特殊楼层的距离
        ans = Math.max(ans, top - special[special.length - 1]);
        return ans;
    }
}
